//#include "hospitalsimple.hpp"
#include <eosim/core/entity.hpp>
#include <eosim/dist/numbergenerator.hpp>
#include <iostream>
#include "reserva.hpp"

using namespace eosim::core;
using namespace eosim::dist;

using namespace std;

Reserva::Reserva(unsigned int cantManadas, unsigned int cantidadLeones, unsigned int porcentajeMachos, bool derriboMuro):
	// se contruyen los eventos B, los eventos C, las distribuciones, los recursos y los histogramas
						eVL(*this),
						sVL(*this),
						eML(*this),
						cCH(*this),
						eNC(*this),
						eAL(*this),
						sAL(*this),
						cantidadLeones(cantidadLeones),
						porcentajeMachos(porcentajeMachos),
						derriboMuro(derriboMuro),
						maduracion(MT19937, 0, 90)
						{
							int leonesPmanada = cantidadLeones/cantManadas;

							for (int i = 0; i < cantManadas; i++)
							{
								if ( i < cantidadLeones%cantManadas )
								{
									manadas.push_back(new Manada(i, leonesPmanada + 1));
								}
								else
								{
									manadas.push_back(new Manada(i, leonesPmanada ));
								}
							}			
			
						}

	Reserva::~Reserva() {}

	void Reserva::init()
	{
		registerBEvent(&eVL);
		registerBEvent(&sVL);
		registerBEvent(&eML);
		registerBEvent(&cCH);
		registerBEvent(&eNC);
		registerBEvent(&eAL);
		registerBEvent(&sAL);

		registerDist(&maduracion);
	}

	void Reserva::doInitialSchedules()
	{
		vector<Leon*>::iterator it;
		for (int i = 0; i < manadas.size(); i++)
		{
			vector<Leon*> leonas = manadas[i]->leonas;

			// encolo leonas para aparearse,empiezo en
			for (it=leonas.begin() ; it < leonas.end(); it++)
			{
				manadas[i]->toMate.push(*it);
			}
			schedule(0, manadas[i], startAL);
		}
	}

